package com.pdweb.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

import com.pdweb.vo.Funcionarios;

public class FuncionariosDao extends DBconnection {
	
	private Connection conn;

	public FuncionariosDao() throws ClassNotFoundException, SQLException {
		this.conn = getConnection();
	}

	public FuncionariosDao(Connection conn) {
		this.conn = conn;
	}

	public void adicionaFuncionario(Funcionarios funcionario) throws SQLException {

		PreparedStatement st = null;

		try {
			st = conn
					.prepareStatement("INSERT INTO FUNCIONARIOS (ID_FUNCIONARIO_FUNC, CARGOS_id_cargo_carg, DIVISOES_ID_DIVISAO_DIV, TURNOS_ID_TURNO_TURN, ST_NOME_FUNC, NM_PIS_FUNC, ST_CIDADE_FUNC, ST_BAIRROEND_FUNC, NM_CEP_FUNC, ST_TELEFONE_FUNC, ST_CELULAR_FUNC, ST_SOBRENOME_FUNC, DT_NASCIMENTO_FUNC, DT_ADMISSAO_FUNC, NM_SALARIO_FUNC, ST_RUAEND_FUNC, NM_NUMEEND_FUNC, ST_UF_FUNC, ST_EMAIL_FUNC) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?);");

			st.setInt(1, funcionario.getIdFuncionario());
			st.setInt(2, funcionario.getIdCargo());
			st.setInt(3, funcionario.getIdDivisao());
			st.setInt(4, funcionario.getIdTurno());
			st.setString(5, funcionario.getNomeFuncionario());
			st.setString(6, funcionario.getPis());
			st.setString(7, funcionario.getCidade());
			st.setString(8, funcionario.getBairro());
			st.setInt(9, funcionario.getCep());
			st.setString(10, funcionario.getTelefone());
			st.setString(11, funcionario.getCelular());
			st.setString(12, funcionario.getSobrenome());
			st.setString(13, funcionario.getNascimento());
			st.setString(14, funcionario.getAdmissao());
			st.setDouble(15, funcionario.getSalario());
			st.setString(16, funcionario.getRua());
			st.setInt(17, funcionario.getNumero());
			st.setString(18, funcionario.getUf());
			st.setString(19, funcionario.getEmail());
			
			st.execute();
		} finally {
			st.close();
		}
	}

	public List<Funcionarios> obterFuncionarios() throws SQLException {

		List<Funcionarios> funcionarios = new ArrayList<Funcionarios>();

		Statement st = null;
		ResultSet rs = null;

		try {
			st = conn.createStatement();
			rs = st.executeQuery("select ID_FUNCIONARIO_FUNC, CARGOS_id_cargo_carg, DIVISOES_ID_DIVISAO_DIV, TURNOS_ID_TURNO_TURN, ST_NOME_FUNC, NM_PIS_FUNC, ST_CIDADE_FUNC, ST_BAIRROEND_FUNC, NM_CEP_FUNC,ST_TELEFONE_FUNC, ST_CELULAR_FUNC, ST_SOBRENOME_FUNC, DT_NASCIMENTO_FUNC, DT_ADMISSAO_FUNC, NM_SALARIO_FUNC, ST_RUAEND_FUNC, NM_NUMEEND_FUNC, ST_UF_FUNC, ST_EMAIL_FUNC, cargos.st_nome_carg, turnos.st_nome_turn, divisoes.ST_NOMEDIVISAO_DIV from funcionarios inner join turnos on (funcionarios.TURNOS_ID_TURNO_TURN = turnos.id_turno_turn) inner join divisoes on (funcionarios.DIVISOES_ID_DIVISAO_DIV = divisoes.id_divisao_div) inner join cargos on (funcionarios.CARGOS_id_cargo_carg = cargos.id_cargo_carg) ;");
			while (rs.next()) {
				Funcionarios result = new Funcionarios();
				
				result.setIdFuncionario(rs.getInt("ID_FUNCIONARIO_FUNC"));
				result.setIdCargo(rs.getInt("CARGOS_id_cargo_carg"));
				result.setIdDivisao(rs.getInt("DIVISOES_ID_DIVISAO_DIV"));
				result.setIdTurno(rs.getInt("TURNOS_ID_TURNO_TURN"));
				result.setNomeFuncionario(rs.getString("ST_NOME_FUNC"));
				result.setPis(rs.getString("NM_PIS_FUNC"));
				result.setCidade(rs.getString("ST_CIDADE_FUNC"));
				result.setBairro(rs.getString("ST_BAIRROEND_FUNC"));
				result.setCep(Integer.parseInt(rs.getString("NM_CEP_FUNC")));
				result.setTelefone(rs.getString("ST_TELEFONE_FUNC"));
				result.setCelular(rs.getString("ST_CELULAR_FUNC"));
				result.setSobrenome(rs.getString("ST_SOBRENOME_FUNC"));
				result.setNascimento(rs.getString("DT_NASCIMENTO_FUNC"));
				result.setAdmissao(rs.getString("DT_ADMISSAO_FUNC"));
				result.setSalario(Double.parseDouble(rs.getString("NM_SALARIO_FUNC")));	
				result.setRua(rs.getString("ST_RUAEND_FUNC"));
				result.setNumero(Integer.parseInt(rs.getString("NM_NUMEEND_FUNC")));
				result.setUf(rs.getString("ST_UF_FUNC"));
				result.setEmail(rs.getString("ST_EMAIL_FUNC"));
				result.setTurno(rs.getString("turnos.st_nome_turn"));
				result.setCargo(rs.getString("cargos.st_nome_carg"));
				result.setDivisao(rs.getString("divisoes.ST_NOMEDIVISAO_DIV"));
				
				funcionarios.add(result);
			}
		} finally {
			st.close();
			rs.close();
		}
		return funcionarios;
	}

	public void excluirFuncionario(Funcionarios funcionario) throws SQLException {

		PreparedStatement st = null;

		try {
			st = conn
					.prepareStatement("delete from Funcionarios where ID_FUNCIONARIO_FUNC = ?;");

			st.setInt(1, funcionario.getIdFuncionario());
			st.execute();
		} finally {
			st.close();
		}
	}

	public Funcionarios obterFuncionario(Funcionarios funcionario) throws SQLException {
		Funcionarios retorno = null;
		Statement st = null;
		ResultSet rs = null;

		try {
			st = conn.createStatement();
			
			//String sql = "select * from Funcionarios where ID_FUNCIONARIO_FUNC = "
			//		+ funcionario.getIdFuncionario();
			String sql = "select ID_FUNCIONARIO_FUNC, CARGOS_id_cargo_carg, DIVISOES_ID_DIVISAO_DIV, TURNOS_ID_TURNO_TURN, ST_NOME_FUNC, NM_PIS_FUNC, ST_CIDADE_FUNC, ST_BAIRROEND_FUNC, NM_CEP_FUNC,ST_TELEFONE_FUNC, ST_CELULAR_FUNC, ST_SOBRENOME_FUNC, DT_NASCIMENTO_FUNC, DT_ADMISSAO_FUNC, NM_SALARIO_FUNC, ST_RUAEND_FUNC, NM_NUMEEND_FUNC, ST_UF_FUNC, ST_EMAIL_FUNC, cargos.st_nome_carg, turnos.st_nome_turn, divisoes.ST_NOMEDIVISAO_DIV from funcionarios inner join turnos on (funcionarios.TURNOS_ID_TURNO_TURN = turnos.id_turno_turn) inner join divisoes on (funcionarios.DIVISOES_ID_DIVISAO_DIV = divisoes.id_divisao_div) inner join cargos on (funcionarios.CARGOS_id_cargo_carg = cargos.id_cargo_carg) where id_funcionario_func = "+funcionario.getIdFuncionario();

			rs = st.executeQuery(sql);

			if (rs.next()) {
				retorno = new Funcionarios();

				retorno.setIdFuncionario(rs.getInt("ID_FUNCIONARIO_FUNC"));
				retorno.setIdCargo(rs.getInt("CARGOS_id_cargo_carg"));
				retorno.setIdDivisao(rs.getInt("DIVISOES_ID_DIVISAO_DIV"));
				retorno.setIdTurno(rs.getInt("TURNOS_ID_TURNO_TURN"));
				retorno.setNomeFuncionario(rs.getString("ST_NOME_FUNC"));
				retorno.setPis(rs.getString("NM_PIS_FUNC"));
				retorno.setCidade(rs.getString("ST_CIDADE_FUNC"));
				retorno.setBairro(rs.getString("ST_BAIRROEND_FUNC"));
				retorno.setCep(Integer.parseInt(rs.getString("NM_CEP_FUNC")));
				retorno.setTelefone(rs.getString("ST_TELEFONE_FUNC"));
				retorno.setCelular(rs.getString("ST_CELULAR_FUNC"));
				retorno.setSobrenome(rs.getString("ST_SOBRENOME_FUNC"));
				retorno.setNascimento(rs.getString("DT_NASCIMENTO_FUNC"));
				retorno.setAdmissao(rs.getString("DT_ADMISSAO_FUNC"));
				retorno.setSalario(Double.parseDouble(rs.getString("NM_SALARIO_FUNC")));	
				retorno.setRua(rs.getString("ST_RUAEND_FUNC"));
				retorno.setNumero(Integer.parseInt(rs.getString("NM_NUMEEND_FUNC")));
				retorno.setUf(rs.getString("ST_UF_FUNC"));
				retorno.setEmail(rs.getString("ST_EMAIL_FUNC"));
				retorno.setTurno(rs.getString("turnos.st_nome_turn"));
				retorno.setCargo(rs.getString("cargos.st_nome_carg"));
				retorno.setDivisao(rs.getString("divisoes.ST_NOMEDIVISAO_DIV"));
			}
			return retorno;
		} finally {
			st.close();
			rs.close();
		}
	}
	
	public void atualizaFuncionario(Funcionarios funcionario) throws SQLException{
		
		PreparedStatement st = null;
		try {
			st = conn
					.prepareStatement("UPDATE pdweb.funcionarios SET CARGOS_id_cargo_carg = '?', DIVISOES_ID_DIVISAO_DIV = '?', TURNOS_ID_TURNO_TURN = '?', ST_NOME_FUNC = '?', NM_PIS_FUNC = '?', ST_CIDADE_FUNC = '?', ST_BAIRROEND_FUNC = '?', NM_CEP_FUNC = '?', ST_TELEFONE_FUNC = '?', ST_CELULAR_FUNC = '?', ST_SOBRENOME_FUNC = '?', DT_NASCIMENTO_FUNC = '?', DT_ADMISSAO_FUNC = '?', NM_SALARIO_FUNC = '?', ST_RUAEND_FUNC = '?', NM_NUMEEND_FUNC = '?', ST_UF_FUNC = '?', ST_EMAIL_FUNC = '?' WHERE funcionarios.ID_FUNCIONARIO_FUNC = ? ;");
			
			st.setInt(1, funcionario.getIdFuncionario());
			st.setInt(2, funcionario.getIdCargo());
			st.setInt(3, funcionario.getIdDivisao());
			st.setInt(4, funcionario.getIdTurno());
			st.setString(5, funcionario.getNomeFuncionario());
			st.setString(6, funcionario.getPis());
			st.setString(7, funcionario.getCidade());
			st.setString(8, funcionario.getBairro());
			st.setInt(9, funcionario.getCep());
			st.setString(10, funcionario.getTelefone());
			st.setString(11, funcionario.getCelular());
			st.setString(12, funcionario.getSobrenome());
			st.setString(13, funcionario.getNascimento());
			st.setString(14, funcionario.getAdmissao());
			st.setDouble(15, funcionario.getSalario());
			st.setString(16, funcionario.getRua());
			st.setInt(17, funcionario.getNumero());
			st.setString(18, funcionario.getUf());
			st.setString(19, funcionario.getEmail());
			st.setInt(20, funcionario.getIdFuncionario());
			
			st.execute();
		} finally {
			st.close();

		}
	}
	
	public List<Funcionarios> consultaFuncionarios(String sql) throws SQLException {

		List<Funcionarios> funcionarios = new ArrayList<Funcionarios>();

		Statement st = null;
		ResultSet rs = null;

		try {
			st = conn.createStatement();
			rs = st.executeQuery(sql);
			
			while (rs.next()) {
				
				Funcionarios result = new Funcionarios();
				
				result.setIdFuncionario(rs.getInt("ID_FUNCIONARIO_FUNC"));
				result.setIdCargo(rs.getInt("CARGOS_id_cargo_carg"));
				result.setIdDivisao(rs.getInt("DIVISOES_ID_DIVISAO_DIV"));
				result.setIdTurno(rs.getInt("TURNOS_ID_TURNO_TURN"));
				result.setNomeFuncionario(rs.getString("ST_NOME_FUNC"));
				result.setPis(rs.getString("NM_PIS_FUNC"));
				result.setCidade(rs.getString("ST_CIDADE_FUNC"));
				result.setBairro(rs.getString("ST_BAIRROEND_FUNC"));
				result.setCep(Integer.parseInt(rs.getString("NM_CEP_FUNC")));
				result.setTelefone(rs.getString("ST_TELEFONE_FUNC"));
				result.setCelular(rs.getString("ST_CELULAR_FUNC"));
				result.setSobrenome(rs.getString("ST_SOBRENOME_FUNC"));
				result.setNascimento(rs.getString("DT_NASCIMENTO_FUNC"));
				result.setAdmissao(rs.getString("DT_ADMISSAO_FUNC"));
				result.setSalario(Double.parseDouble(rs.getString("NM_SALARIO_FUNC")));	
				result.setRua(rs.getString("ST_RUAEND_FUNC"));
				result.setNumero(Integer.parseInt(rs.getString("NM_NUMEEND_FUNC")));
				result.setUf(rs.getString("ST_UF_FUNC"));
				result.setEmail(rs.getString("ST_EMAIL_FUNC"));
				result.setTurno(rs.getString("turnos.st_nome_turn"));
				result.setCargo(rs.getString("cargos.st_nome_carg"));
				result.setDivisao(rs.getString("divisoes.ST_NOMEDIVISAO_DIV"));

				funcionarios.add(result);
				
			}
		} finally {
			st.close();
			rs.close();
		}
		return funcionarios;
	}
}
